/*!
 * JQuery plugIn
 * @author King<br/>
 *         email:my249645546@163.com
 * @Description JQuery 插件库
 * @since 1.0.0
 * @Date 2012-4-28 13:51:30
 * */

/*!
 * putaopi-support.Html5
 * @author King<br/>
 *         email:my249645546@163.com
 * @Description 判断浏览器是否支持html5
 * @since 1.0.0
 * @Date 2012-8-31 11:01:11
 * */
(function($){
	$.support.html5=$.support.leadingWhitespace;
})(jQuery);

/**
 * 滑出菜单 插件
 */
(function($){
	$.fn.tipMenu = function(setting){
		var defultSetting={
			title:$(this).selector,
			titleHover:"hover",
			titleOut:"out",
			tip:"#tipMenu",
			isIcon:false,
			icon:"#tipIcon",
			iconHover:"iconDown",
			iconOut:"iconUP",
			position:"left"
		};
		setting=setting||{};
		$.extend(true,defultSetting,setting);
		
		var eventSrcObj=$($(this).selector);
		var title=$(defultSetting.title);
		var tipObj=$(defultSetting.tip);
		var icon=$(defultSetting.icon);
		
		var showTip=function(){
			var left=0;
			if(defultSetting.position=="left"){
				left=$(title).offset().left;
			}else{
				var titleWidth=$(title).innerWidth();
				var tipObjWidth=$(tipObj).innerWidth();
				left=$(title).offset().left-tipObjWidth+titleWidth;
			}
			
			var top=$(title).offset().top+$(title).innerHeight();
			$(tipObj).show();
			$(tipObj).css({
				"top" : top,
				"left" : left,
				"margin" : 0
			});
			
			$(title).removeClass(defultSetting.titleOut).addClass(defultSetting.titleHover);
			if(defultSetting.isIcon&&icon.length){
				$(icon).removeClass(defultSetting.iconOut).addClass(defultSetting.iconHover);
			}
		};
		
		var hideTip=function(){
			$(tipObj).hide();
			$(title).removeClass(defultSetting.titleHover).addClass(defultSetting.titleOut);
			if(defultSetting.isIcon&&icon.length){
				$(icon).removeClass(defultSetting.iconHover).addClass(defultSetting.iconOut);
			}
		};
		
		$(eventSrcObj).hover(
			function(){
				showTip();
			}, 
			function(){
				hideTip();
			}
		);
		$(tipObj).hover(
			function(){
				showTip();
			}, 
			function(){
				hideTip();
			}
		);
	};
})(jQuery);

/*!
 * putaopi-ellipsis plugIn
 * @author King<br/>
 *         email:my249645546@163.com
 * @Description 自动判断文本宽度是否超出 超出则用… 替换 
 * @since 1.0.0
 * @Date 2012-5-11 14:55:09
 * */
(function($){
	$.fn.ellipsis = function(num){
		this.each(function(){
			$(this).attr("title",$.trim($(this).text()));
			
			var width=$(this).parent().innerWidth();
			if($.browser.mozilla){
				if(!num>=0){
					$(this).css({
						'float':'left',
						'width':width,
						'white-space': 'nowrap',
						'overflow': 'hidden'
					});
					var copyThis = $(this.cloneNode(true)).hide().css({
						'position': 'absolute',
						'width': 'auto',
						'overflow': 'visible'
					});	
					$(this).after(copyThis);
					
					var ellipsisObj=$(this);
					var sub=function(){
						if(copyThis.width()>ellipsisObj.width()){
							copyThis.text(copyThis.text().substring(0,copyThis.text().length-4));
							copyThis.html(copyThis.html()+'…');
							sub();
						}else{
							ellipsisObj.html(copyThis.html());
							copyThis.remove(); //清除复制
						}
					};
					sub();
				}else{
					var maxwidth=num;
					if($(this).text().length>maxwidth){
						$(this).text($(this).text().substring(0,maxwidth));
						$(this).html($(this).html()+'…');
					}
				}
			}else{
//				非火狐浏览器无法使用css实现自动省略效果: 
				$(this).css({
					'float':'left',
					'width':width,
					'white-space': 'nowrap',
					'text-overflow': 'ellipsis',
					'-o-text-overflow': 'ellipsis',
					'overflow': 'hidden'
				});
			}
		});
	}		  
})(jQuery);

/*!
 * putaopi-checkNavigatorFlash plugIn
 * @author King<br/>
 *         email:my249645546@163.com
 * @Description 判断浏览器是否支持flash
 * @since 1.0.0
 * @Date 2012-5-11 14:55:09
 * */
(function($){
	$.checkNavigatorFlash=function(){
		var iFlash = null;
		var version = null;
		var isIE = $.browser.msie;
		if(isIE){
			//for IE
			if (window.ActiveXObject) {
				var control = null;
				try {
					control = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
				} catch (e) {
					iFlash = false;
				}
				if (control) {
					iFlash = true;
//					version = control.GetVariable('$version').substring(4);
//					version = version.split(',');
//					version = parseFloat(version[0] + '.' + version[1]);
//					alert("FLASH版本号："+version)
				}
			}
		}else{
			//for other
			if (navigator.plugins) {
				for (var i=0; i < navigator.plugins.length; i++) {
					if (navigator.plugins[i].name.toLowerCase().indexOf("shockwave flash") >= 0) {
						iFlash = true;
//						version = navigator.plugins[i].description.substring(navigator.plugins[i].description.toLowerCase().lastIndexOf("Flash ") + 6, navigator.plugins[i].description.length);
					}
				}
			}	
		}
		return iFlash;
	};
})(jQuery);

/*!
 * putaopi-pager plugIn
 * @author King<br/>
 *         email:my249645546@163.com
 * @Description 分页插件
 * @since 1.0.0
 * @Date 2012-5-31 15:55:43
 * */
(function(){
	/**
	 * pager BO
	 */
	var PagerService={
		/**
		 * 表单验证
		 */
		pagerValidator:function(formId){
			return putaopi.core.validator.validatorTools.formValidator.getValidateResult(formId);
		},
		/**
		 * 转到指定页数 输入验证
		 * @param {} pagerId
		 */
		pageToValidator:function(pagerId){
			var pageToFormId=pagerId+"_pagerForm";
			var pageToInputId=pagerId+"_pageToNum";
			putaopi.core.validator.validatorTools.formValidator.validatorInitConfig({validatorgroup:pageToFormId});
			jQuery("#"+pageToInputId).formValidator({
				validatorgroup:pageToFormId
			}).inputValidator({
				min : 1,
				max : 4,
				onerror : "请输入要转到的页数！"
			}).regexValidator({
				regexp : putaopi.core.validator.validatorTools.regexs.intNumber,
				onerror : "页数只能是10万以内的正整数！"
			}).compareValidator({
				desid : pagerId+"_totalPageHide",
				operateor : "<=",
				datatype :"number",
				onerror : "页数不能大于总页数！"+"<br/>当前总页数为："+$("#"+pagerId+"_totalPageHide").val()
			});
		}
	};
	/**
	 * pager Controller
	 */
	var PagerAction={
		/**
		 * 点击事件
		 */
		click:function(option){
			var setting={
				pageNo:"0",
				formId:"searchForm",
				formValidator:PagerService.pagerValidator
			};
			$.extend(setting,option);
			
			var pageNo=setting.pageNo;
			var formId=setting.formId;
			var searchForm=$("#"+formId);
			
			if(searchForm.length>0){
				var pageNoInput=$("#"+formId+"_pageNoHide");
				if(pageNoInput.length==0){
					var pageNoInputHtml='<input type="hidden" id="'+formId+'_pageNoHide" name="pageNo" value="'+pageNo+'"/>';
					$(searchForm).append(pageNoInputHtml);
				}else{
					$(pageNoInput).val(pageNo);
				}
				if(setting.formValidator(formId)){
					$(searchForm).submit();
				}
			}else{
				putaopi.common.utils.openUrl(putaopi.common.utils.addParameterToUrl("pageNo",pageNo));
			}
		},
		/**
		 * 转到指定页数 表单初始化
		 */
		pageTo:function(option){
			var formId=option.formId;
			var pagerId=option.pagerId;
			
			PagerService.pageToValidator(pagerId);
			
			var pageToFormId=pagerId+"_pagerForm";
			var pageToInputId=pagerId+"_pageToNum";
			$("#"+pageToFormId).bind("submit",function(){
				if(putaopi.core.validator.validatorTools.formValidator.getValidateResult(pageToFormId)){
					var eventParameter={
						pageNo:$("#"+pageToInputId).val(),
						formId:formId,
						formValidator:option.formValidator
					};
					option.clickEvent(eventParameter);
				}
				return false;
			});
		}
	};
	
	/**
	 * pager View
	 */
	var PagerView={
		/**
		 * 分页标签初始化
		 * @param {} setting: clickEvent 单击事件处理函数 默认为pagerLink;eventParameter:单击事件参数对象; pagerId 分页标签Id
		 */
		init:function(option){
			var setting={
				clickEvent:PagerAction.click,
				pagerId:"J_pager",
				pagerItem:"li>a",
				data:""
			};
			$.extend(setting,option);
			
			var pagerEl=$("#"+setting.pagerId);
			if(pagerEl.length>0){
				var formId=$("#"+setting.pagerId+"_formIdHide").val();
				
				var eventParameter={
					formId:formId,
					formValidator:setting.formValidator
				};
					
				$(document).delegate("#"+setting.pagerId+" "+setting.pagerItem,"click",function(){
					setting.clickEvent(
						$.extend(eventParameter,{pageNo:this.id},{data:setting.data})
					);
				});
				
				if($("#"+setting.pagerId+"_pagerForm").length>0){
					PagerAction.pageTo(
						$.extend(eventParameter,{clickEvent:setting.clickEvent,pagerId:setting.pagerId})
					);
				}
			}
		}
	};
	
	$.pager=PagerView.init;
})(jQuery);


/*!
 * putaopi-checkAll plugIn
 * @author King<br/>
 *         email:my249645546@163.com
 * @Description 复选框全选、反选插件
 * @since 1.0.0
 * @Date 2012-6-1 13:26:41
 * */
(function($){
	/**
	 * 
	 * @Description:复选框全选、反选
	 * @since 1.0.0
	 * @Date:2012-4-1 上午11:15:34
	 * @param name 复选框name
	 * @param checked 是否选中 
	 * void
	 */
	var checkAll4CheckBox=function(option) {
		var setting={
			selector:"#checkAll",
			itemSelector:"[name='itemListCheckBox']"
		};
		$.extend(setting,option);
		
		$(setting.selector).bind("click",function(){
			var checked=this.checked;
			$(setting.itemSelector).each(function(){
				this.checked = checked;
			});
		});
	}
	
	$.checkAll=checkAll4CheckBox;
})(jQuery);

/*!
 * putaopi-fixComponent plugIn
 * @author King<br/>
 *         email:my249645546@163.com
 * @Description 将元素固定在页面某个位置
 * @since 1.0.0
 * @Date 2012-8-23 11:12:11
 * */
(function($){
	var fixComponent=function(option){
		var setting={
			fix:"#toTop",
			topReference:"#main",
			bottomReference:"#footer",
			model:"switch",//switch|addFixClass
			callback:function(fix){}
		};
		$.extend(setting,option);
		
		var fix=$(setting.fix);
		if(fix.length){
			var fixCssTop=fix.css("top");
		
			var setFixPosition=function(){
				var bodyTop=$(document).scrollTop();
				var topReferenceTop=$(setting.topReference).offset().top;
				var bottomReferenceTop=$(setting.bottomReference).offset().top;
				var fixTop=fix.offset().top;
				
				//但页面滚动到顶部参照物时，部件才显示
				if(bodyTop>topReferenceTop){
					if(setting.model=="switch"){
						fix.fadeIn();
					}else{
						fix.addClass("fix");
					}

					//不可跨过底部参照物
					if((fixTop+fix.outerHeight())>=(bottomReferenceTop-10)){
						var fall=$(setting.bottomReference).outerHeight()+fix.outerHeight()+20;
						fix.css("top","100%").css("marginTop",-fall);
					}else{
						fix.css("top",fixCssTop).css("marginTop",0);
					}
				}else{
					if(setting.model=="switch"){
						fix.fadeOut();
					}else{
						fix.removeClass("fix");
					}
				}
			};
			
			setFixPosition();
			
			$(window).bind("scroll",function(){
				setFixPosition();
			});
			
			setting.callback(fix);
		}
	}
	$.fixComponent=fixComponent;
})(jQuery);


/*!
 * putaopi-inputPlaceholder plugIn
 * @author King<br/>
 *         email:my249645546@163.com
 * @Description 模拟html5 的Placeholder效果。获得焦点时将input 内容清空，失去焦点时如果用户没有输入任何内容则input设置为默认值
 * @since 1.0.0
 * @Date 2012-8-30 17:18:19
 * */
(function($){
	/**
	 * fix程序
	 */
	var inputPlaceholderFix=function(target){
		var input=$(target);
		var inputEL=input[0];
		var value=input.attr("placeholdertext");
		
		if($.support.html5 && ("placeholder" in inputEL)){
			input.attr("placeholder",value);
		}else{
			if(input.attr("type")=="password"){
				input.attr("title",value);
			}else{
				if(!inputEL.value){
					inputEL.value=value;
					input.addClass("inputPlaceholder");
				}
				
				$(input).bind("focus",function(){
					if(this.value==value){
						this.value="";
					}
					input.removeClass("inputPlaceholder");
				});
				$(input).bind("blur",function(){
					if(!this.value){
						this.value=value;
						input.addClass("inputPlaceholder");
					}
				});
				var form=$(input).parents("form");
				form.bind("submit",function(){
					if(input.val()==value){
						input.val("");
						form.submit();
					}
				});
			}
		}
	};
	
	var inputPlaceholder=function(selector){
		var inputs=$(selector);
		if(inputs.length){
			inputs.each(function(){
				inputPlaceholderFix(this);
			});
		}
	}
	$.inputPlaceholder=inputPlaceholder;
	$.fn.inputPlaceholder=function(){
		inputPlaceholderFix(this);
	};
})(jQuery);


/*!
 * putaopi-selectFix plugIn
 * @author King<br/>
 *         email:my249645546@163.com
 * @Description 修补ie下select 无法使用css设置高度 以及右侧箭头美化。
 * 				 现将select透明度设置为0，然后使用一个div放在select的下方。当select选择某个值时，这个div显示选择结果。
 * 				注意：这个方法依然无法将select的高度拉升，所以ie下会发现点击模拟的select（遮挡的div）时，下拉框无法展开。
 * @since 1.0.0
 * @Date 2012-9-26 17:07:36
 * */
(function($){
	var selectFix=function(){
		var select=$(this);
		var selectFixDiv="";
		
		/**
		 * 美化程序
		 */
		var fix=function(){
			$(select).css({
				"opacity":0
			});

			if(!select.is(":hidden")){
				var sOptions=select.get(0).options;

				var setFixDivText=function(selectValue){
					var text="";
					for(var i=0;i<sOptions.length;i++){
						var option=sOptions[i];
						if(option.value==selectValue){
							text=$(option).text();
							break;
						}
					}
					return text;
				};
				
				var fixDivClass="selectFix";
				if(select.attr("fixIcon")=="small"){
					fixDivClass+=" selectFixS";
				}

				selectFixDiv=$('<div id="J_selectFix_'+select.attr("id")+'" class="'+fixDivClass+'">'+setFixDivText($(select).val())+'</div>');
				select.after(selectFixDiv);

				var left=$(select).offset().left;
				var top=$(select).offset().top-1;
				$(selectFixDiv).css({
					"top" : top,
					"left" : left,
					"margin" : 0
				});

				$(select).bind("change click",function(){
					$(selectFixDiv).text(setFixDivText($(this).val()));
				});
			}else{
				var tasks = function(){
					if(!$(select).is(":hidden")){
						$(select).selectFix();
						clearInterval(timer);
					}
				};
				var timer=setInterval(tasks,500);
			}
		};
		
		/**
		 * select位置监听程序
		 * 有的时候，select所处的容器可能被添加新的元素，或者原本隐藏的内容被显示出来，导致select的位置发生变化。
		 * 这时，我们设置一个监听程序，以便select位置发生变化时，再次调用fix函数
		 */
		var positionListener=function(){
			var left=$(select).offset().left;
			var top=$(select).offset().top-1;
			
			var tasks = function(){
				var leftNow=$(select).offset().left;
				var topNow=$(select).offset().top-1;
				if((leftNow!=left||topNow!=top)&&!select.is(":hidden")){
					left=leftNow;
					top=topNow;
					$(selectFixDiv).css({
						"top" : top,
						"left" : left
					});
				}
			};
			var timer=setInterval(tasks,500);
		};
		
		//ie6下 select无法设置透明度 所以 ie6下 不进行美化
		if(!($.browser.msie&&$.browser.version=="6.0")){
			fix();
			positionListener();
		}
	};
	$.fn.selectFix=selectFix;
})(jQuery);


/*!
 * putaopi-checkBoxFix plugIn
 * @author King<br/>
 *         email:my249645546@163.com
 * @Description 对checkbox进行美化
 * @since 1.0.0
 * @Date 2013-5-15 13:50:22
 * */
(function($){
	var checkBoxFix=function(){
		$(this).click(function(){
			var checkBox=$(this);
			var id=checkBox.attr("id");
			var fix=$("#J_checkBoxFix_"+id);
			if(checkBox.get(0).checked){
				fix.removeClass("checkBox");
				fix.addClass("checkBoxChecked");
			}else{
				fix.removeClass("checkBoxChecked");
				fix.addClass("checkBox");
			}
		});
	};
	$.fn.checkBoxFix=checkBoxFix;
})(jQuery);


/*!
 * putaopi-scrollableFix plugIn
 * @author King<br/>
 *         email:my249645546@163.com
 * @Description jquery.tools中的scrollable在 显示scrollItem区域 大于 单个scrollItem 的时候，滚动到末尾会出现空白 本插件是为了修复这一bug
 * @since 1.0.0
 * @Date 2012-10-25 18:31:18
 * */
(function($){
	var scrollableFix=function(option){
		var component=$(this);
		var scrollable=component.scrollable(option);
		var scroll=component.data("scrollable");
		
		var items=scroll.getItems();
		items.clone().insertAfter(items.slice(-1));
		
		scroll.onBeforeSeek(function(a, b, c) {
			if (!a.isDefaultPrevented()) {
				if (b == items.length || b == -1) {
					scroll.begin(0);
					return a.preventDefault();
				}
				b == scroll.getSize() && scroll.begin(0);
			}
		});
		
		return scrollable;
	};
	$.fn.scrollableFix=scrollableFix;
})(jQuery);

/*!
 * putaopi-minSizeForIE6Fix plugIn
 * @author King<br/>
 *         email:my249645546@163.com
 * @Description 修复IE6不支持min-width、min-height 
 * @since 1.0.0
 * @Date 2012-10-25 18:31:18
 * */
(function($){
	var minSizeForIE6Fix=function(){
		var obj=$(this),minSize;
		try{
			minSize=$.parseJSON(obj.attr("minSizeFix"));
		}catch(e){
			minSize="";
		}
		minSize=minSize||{};
		var minWidth=minSize.width,minHeight=minSize.minHeight,objWidth=obj.outerWidth(),objHeight=obj.outerHeight();
		if(minWidth){
			if(minWidth>=objWidth){
				obj.css("width",minWidth);
			}else{
				obj.css("width",objWidth);
			}
		}
		
		if(minHeight){
			if(minHeight>=objHeight){
				obj.css("height",minHeight);
			}else{
				obj.css("height",objHeight);
			}
		}
		
		return obj;
	};
	$.fn.minSizeForIE6Fix=minSizeForIE6Fix;
})(jQuery);

/*!
 * Pandora-minSizeForIE6Fix plugIn
 * @author King<br/>
 *         email:my249645546@163.com
 * @Description 修复ie6下 js提交表单 出现的服务器端IO异常（“远程主机强迫关闭了一个现有的连接”）
 * @since 1.0.0
 * @Date 2013-6-22 12:05:10
 * */
(function($){
	if($.browser.msie&&$.browser.version=="6.0"){
		$.aop.around(
			{
				target:$.fn,
				method: 'submit'
			},
			function(invocation){
				setTimeout(function(){
					return invocation.proceed();
	    		}, 20);
			}
		);
	}
})(jQuery);